package com.leetcode;

/**
 * 1750. 删除字符串两端相同字符后的最短长度 (中等)
 * <p>
 * 给你一个只包含字符 'a'，'b' 和 'c' 的字符串 s ，你可以执行下面这个操作（5 个步骤）任意次：
 * 1. 选择字符串 s 一个 非空 的前缀，这个前缀的所有字符都相同。
 * 2. 选择字符串 s 一个 非空 的后缀，这个后缀的所有字符都相同。
 * 3. 前缀和后缀在字符串中任意位置都不能有交集。
 * 4. 前缀和后缀包含的所有字符都要相同。
 * 5. 同时删除前缀和后缀。
 * 请你返回对字符串 s 执行上面操作任意次以后（可能 0 次），能得到的 最短长度 。
 */
public class LeetCode1750 {

    public static void main(String[] arg0) {
        String s = "c";
        System.out.println("删除字符串两端相同字符后的最短长度 = " + minimumLength(s));
    }

    public static int minimumLength(String s) {
        if (s.length() == 1) {
            return 1;
        }

        // i和j用来记录删除两端相同字符后的前后下标, i <= j
        int i = 0;
        int j = s.length() - 1;

        while (i < j && s.charAt(i) == s.charAt(j)) {
            // 从左向右找到不同的字母后记录这个不同字母的下标
            for (int k = i; k < j; k++) {
                if (s.charAt(k) != s.charAt(k + 1)) {
                    i = k + 1;
                    break;
                } else if ((k + 1) == j && s.charAt(k) == s.charAt(k + 1)) { // 最后一次循环字符还是相同的话，直接让i = j
                    i = j;
                }
            }

            // 从右向左找到不同的字母后记录这个不同字母的下标
            for (int k = j; k > i; k--) {
                if (s.charAt(k) != s.charAt(k - 1)) {
                    j = k - 1;
                    break;
                }
            }
        }

        if (i == j) { // 两种结果，一种长度是0，一种是长度是1
            if (s.charAt(i) == s.charAt(i - 1)) {
                return 0;
            } else {
                return 1;
            }
        } else {
            return j - i + 1;
        }
    }

}
